home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 July / EnigmA AMIGA RUN 20 (1997)(G.R. Edizioni)(IT)[!][issue 1997-07 & 08][EAR-CD IV].iso / earcd / dev / amos / moreusel.lha / HunkExtract.AMOS / HunkExtract.amosSourceCode
AMOS Source Code  |  1997-04-18  |  6KB  |  217 lines

  1. ' ***************************************
  2. ' *                                     *
  3. ' *       Hunk Extract V1.1 gamma       *
  4. ' *       Written by Chris Hodges       *
  5. ' *                                     *
  6. ' ***************************************
  7. '
  8. Dim HL(100)
  9. P$=Command Line$
  10. Screen Open 0,640,256,2,$8000
  11. Curs Off 
  12. Centre "Hunk Extract V1.1gamma" : Print 
  13. Centre "Written by Chris Hodges" : Print : Print 
  14. If P$=""
  15.   Print "This tool enables you to rip memory banks out of compiled AMOS programs."
  16.   Print "Currently it works with AMOS Creator and AMOS Professional executables,"
  17.   Print "AMOS-squashed and unpacked. The only exception: old AMOS Creator Sprite banks"
  18.   Print "can be saved, but cannot be reloaded into AMOS (so don't try to do that)."
  19.   Print "I'll try to write a special save-routine for the next version."
  20.   Print 
  21.   Print "Rip and enjoy.."
  22.   Print 
  23.   Print "Press any key to continue..."
  24.   Repeat 
  25.     I$=Inkey$ : Multi Wait 
  26.   Until I$<>""
  27.   Cls 
  28. End If 
  29. Repeat 
  30.   Gosub RIPHUNKS
  31.   Print String$("-",80);
  32.   Print "Another file (Y/N)? ";
  33.   Repeat 
  34.     I$=Upper$(Inkey$) : Multi Wait 
  35.   Until I$="N" or I$="Y"
  36.   Print I$
  37. Until I$="N"
  38. End 
  39. RIPHUNKS:
  40.   If P$=""
  41.     F$=Fsel$("","","Select an unpacked","AMOS executable")
  42.     If F$="" : End : End If 
  43.   Else 
  44.     F$=P$ : P$=""
  45.   End If 
  46.   If Exist(F$)=0 Then Print "File not found!" : Return 
  47.   Print "Loading: ";F$
  48.    Extension_8_0456 F$,9
  49.   ST=Start(9)
  50.   If Leek(ST)<>$3F3 Then Print "Not an executable!" : Return 
  51.   Add ST,4
  52.   While Leek(ST)
  53.     Add ST,Leek(ST)*4+4
  54.   Wend 
  55.   Add ST,4
  56.   NH=Leek(ST)
  57.   SH=Leek(ST+4)
  58.   LH=Leek(ST+8)
  59.   Add ST,12
  60.   Print "Hunks:";NH
  61.   Print "First:";SH
  62.   Print "Last :";LH
  63.   For A=SH To LH
  64.     HL(A)=Leek(ST)*4 : Add ST,4
  65.     Print "Hunk";A;"  Length:";HL(A)
  66.   Next 
  67.   For A=SH To LH
  68.     HT=Leek(ST) and $FFFFFF : HL=Leek(ST+4)*4 : Add ST,8
  69.     Print "Hunk";A;": ID=";Hex$(HT,8)
  70.     If HL<>HL(A) Then Print "Error: Length error";HL;"<>";HL(A)
  71.     If HT=$3EB Then HL=4
  72.     If HT=$3E9 or HT=$3EA
  73.       OST=ST : OHL=HL
  74.       BN=Leek(ST) : ABN$=Peek$(ST+8,8)
  75.       If BN= Extension_8_0998("xVdg")
  76.         Gosub CRUNCHED
  77.         BN=Leek(ST) : ABN$=Peek$(ST+8,8)
  78.       End If 
  79.       If BN= Extension_8_0998("AmSp")
  80.         Print String$("-",80);
  81.         Print "Found AMOS Pro sprite bank"
  82.         BN$="Sprites.abk"
  83.         Gosub FSPRITE
  84.       End If 
  85.       If BN= Extension_8_0998("AmIc")
  86.         Print String$("-",80);
  87.         Print "Found AMOS Pro icons bank"
  88.         BN$="Icons.abk"
  89.         Gosub FSPRITE
  90.       End If 
  91.       FL=Deek(ST+4)
  92.       For B=1 To 8
  93.         P=Asc(Mid$(ABN$,B,1))
  94.         Exit If P<32 or P>127
  95.       Next 
  96.       If B=9
  97.         If ABN$="Sprites " or ABN$="Icons   "
  98.           If ABN$="Sprites "
  99.             Print String$("-",80);
  100.             Print "Found AMOS Creator sprite bank"
  101.             BN$="Sprites.abk" : ID$="AmSp"
  102.           Else 
  103.             Print String$("-",80);
  104.             Print "Found AMOS Creator icons bank"
  105.             BN$="Icons.abk" : ID$="AmIc"
  106.           End If 
  107.           Gosub FSPRITECREATOR
  108.         Else 
  109.           If Abs((BN and $FFFFFFC)-HL)<17 and((FL and $FFFFFF)<17)
  110.             BL=(BN and $FFFFFFC) : BN=(FL and $FFFFFFF)
  111.             FL= Extension_8_093A(Peek(ST),6)
  112.             Print String$("-",80);
  113.             Print "Probably found bank: AMOS Creator"
  114.             Gosub FBANK
  115.             Print 
  116.           Else 
  117.             If(BN and $FFFFFFF)<$8000
  118.               BL=HL-16 : BN=BN and $FFFFFFF
  119.               Print String$("-",80);
  120.               Print "Probably found bank: AMOS Pro"
  121.               Gosub FBANK
  122.               Print 
  123.             End If 
  124.           End If 
  125.         End If 
  126.       End If 
  127.       ST=OST : HL=OHL
  128.       Add ST,HL
  129.       Do 
  130.         HE=Leek(ST) : Add ST,4
  131.         Exit If HE=$3F2
  132.         If HE<$3EC or HE>$3EE
  133.           Print "Warning: Unknown hunk ID=";Hex$(HE,8)
  134.         Else 
  135.           Print "Warning: Hunk has reloc table (maybe not AMOS!)"
  136.         End If 
  137.         Do 
  138.           AO=Leek(ST) : Add ST,4
  139.           Exit If AO=0
  140.           HN=Leek(ST) : Add ST,4+AO*4
  141.         Loop 
  142.       Loop 
  143.     Else 
  144.       Add ST,HL
  145.     End If 
  146.     Erase 10
  147.   Next 
  148.   Erase 9
  149.   Print "No more hunks in file."
  150. Return 
  151. CRUNCHED:
  152.   LP=Leek(ST+4)
  153.   L=Leek(ST+8)
  154.   Print "Hunk is squashed. Packed:";L;At(35,);"Unpacked:";LP;At(55,);"Rate:";100-((L*100)/LP);"%"
  155.   Reserve As Work 10,LP
  156.   Copy ST+12,ST+12+L To Start(10)
  157.   ST=Start(10)
  158.   X= Extension_5_00E4(ST,L)
  159. '  HL=(Leek(ST) and $FFFFFFC)+8
  160.   HL=LP
  161. Return 
  162. FSPRITE:
  163.   Print "Images:";Deek(ST+4);
  164.   If Deek(ST+4)=39 Then Print " (Probably mouse.abk)" Else Print 
  165.   Print "Save bank (Y/N)? ";
  166.   Repeat 
  167.     I$=Upper$(Inkey$) : Multi Wait 
  168.   Until I$="N" or I$="Y"
  169.   Print I$
  170.   If I$="N" Then Return 
  171.   F$=Fsel$("",BN$,"Enter name for","the bank")
  172.   If F$="" Then Return 
  173.   Print "Saving: ";F$
  174.   Bsave F$,ST To ST+HL
  175. Return 
  176. FSPRITECREATOR:
  177.   Print "Images:";BN
  178.   Print "Save bank (Y/N)? ";
  179.   Repeat 
  180.     I$=Upper$(Inkey$) : Multi Wait 
  181.   Until I$="N" or I$="Y"
  182.   Print I$
  183.   If I$="N" Then Return 
  184.   F$=Fsel$("",BN$,"Enter name for","the bank")
  185.   If F$="" Then Return 
  186.   Print "Saving: ";F$
  187.   Open Out 1,F$
  188.     Print #1,ID$;
  189.     Ssave 1,ST+16 To ST+HL
  190.   Close 1
  191. Return 
  192. FBANK:
  193.   Print "Number:";BN
  194.   Print "Flags : ";Hex$(FL,4)
  195.   Print "Length:";BL
  196.   Print "Name  : ";ABN$
  197.   Print "Save bank (Y/N)? ";
  198.   Repeat 
  199.     I$=Upper$(Inkey$) : Multi Wait 
  200.   Until I$="N" or I$="Y"
  201.   Print I$
  202.   If I$="N" Then Return 
  203.   Print "Save as raw (Y/N)? ";
  204.   Repeat 
  205.     I$=Upper$(Inkey$) : Multi Wait 
  206.   Until I$="N" or I$="Y"
  207.   Print I$
  208.   BN$="Bank"+Mid$(Str$(BN),2)
  209.   If I$="N" Then BN$=BN$+".Abk"
  210.   F$=Fsel$("",BN$,"Enter name for","Bank"+Str$(BN))
  211.   If F$="" Then Return 
  212.   Print "Saving: ";F$
  213.   Open Out 1,F$
  214.     If I$="N" Then Print #1,"AmBk"+ Extension_8_08D2(BN)+ Extension_8_08D2(FL)+ Extension_8_08D2(BL+8)+ABN$;
  215.     Ssave 1,ST+16 To ST+BL+16
  216.   Close 1
  217. Return